module.exports.genResponse = function(status, data, message) {
  return {
    ok: status,
    data,
    msg: message,
  }
}

module.exports.validatePassword = function(password) {
  // 检查密码长度是否在 6 到 8 个字符之间
  if (!password || password.length < 6 || password.length > 8) {
    return 'Password must be 6 to 8 characters long.';
  }

  // 使用正则表达式检查至少包含一个大写字母
  if (!/[A-Z]/.test(password)) {
    return 'Password must contain at least one uppercase letter.';
  }

  // 使用正则表达式检查至少包含一个小写字母
  if (!/[a-z]/.test(password)) {
    return 'Password must contain at least one lowercase letter.';
  }

  // 使用正则表达式检查至少包含一个数字
  if (!/\d/.test(password)) {
    return 'Password must contain at least one digit.';
  }

  // 使用正则表达式检查至少包含一个特殊字符
  if (!/[!@#$%^&*]/.test(password)) {
    return 'Password must contain at least one special character (!@#$%^&*).';
  }

  return null;
}

module.exports.random = function(min, max) {
  return Math.floor(Math.random() * max) + min;
}

module.exports.timestamp = function() {
  return Math.floor(Date.now() / 1000)
}

module.exports.replaceRoot = function (field) {
  return {
    $replaceRoot: { newRoot: { $mergeObjects: [{ $arrayElemAt: [`$${field}`, 0] }, "$$ROOT"] } }
  }
}

/**
 * 通用 media $lookup
 * @returns texture field
 */
module.exports.pipelineMedia = function(params) {
  return [
    {
      $lookup: {
        from: params.from,
        localField: params.localField || 'id',
        foreignField: params.foreignField || 'id',
        as: 'ref_media'
      }
    },
    {
      $addFields: {
        texture: { $arrayElemAt: ['$ref_media', 0] }
      }
    }
  ]
}

/**
 * 原数据 pipeline
 */
module.exports.raw$project = {
  $project: {
    'raw._id': 0,
    'raw.created_at': 0,
    'raw.updated_at': 0,
    'raw.__v': 0,
  }
}

/**
 * match pipeline: id
 */
module.exports.pipeline$match = function(id) {
  return { $match: { id: parseInt(id) } }
}

/**
 * $toString pipeline
 * */
module.exports.toString = function(field) {
  return { $toString: field }
}

/**
 * 表没有的字段，返回 null
 * */
module.exports.condNull = function(field, value) {
  return {
    $cond: {
      if: { $ifNull: [field, false] },
      then: value,
      else: null
    }
  }
}
